﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Blockmania.Classes;

namespace Blockmania.Classes
{
    class Klots
    {
        // Iga tile on 30x30 pixlit
        public const int tyki_suurus = 30;

        // Default blocki alguspositsioon on (0, 3)
        // 4 x 4 kast joonistatakse rida = 0 tulp = 3 mängulaua 18*10 keskele

        public const int start_rida = 0;
        public const int start_tulp = 3;

        // Meil on 7 erinevat blocki tüüpi
        // Iga block koosneb 4 tükist, millest igatükk on samat värvi
        // Kõik klotsid on kirjeldatud arrays KLOTSID, kus hoiame nende pöörde olekuid
        // Esimene komponent = 0..6 blocki tüüp
        // Teine komponent 0..3 pöörde olek
        // Kolmas ja neljas tähistavad rea ja tulba numbrit 4x4 kastis 0..3

        public static readonly int[, , ,] KLOTSID = new int[7, 4, 4, 4]
        #region Array sisselugemine

            {
                // L-Block = 0
                {
                    // asend = 0
                    {
                        {1, 0, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {1, 1, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {0, 0, 0, 0}, 
                        {0, 0, 1, 0}, 
                        {1, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {0, 1, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {1, 1, 1, 0}, 
                        {1, 0, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // L-block lõpp
            
                // J-Block = 1
                {
                    // asend = 0
                    {
                        {0, 0, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {1, 1, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {1, 1, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {0, 0, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {1, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // J-block lõpp


                // T-Block = 2
                {
                    // asend = 0
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 0, 0}, 
                        {1, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {0, 0, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {1, 1, 1, 0}, 
                        {0, 1, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {1, 0, 0, 0}, 
                        {1, 1, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // T-block lõpp

                // S-Block = 3
                {
                    // asend = 0
                    {
                        {0, 1, 1, 0}, 
                        {1, 1, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {1, 0, 0, 0}, 
                        {1, 1, 0, 0}, 
                        {0, 1, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {1, 1, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {0, 1, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 1, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // S-block lõpp

                // Z-Block = 4
                {
                    // asend = 0
                    {
                        {1, 1, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {0, 1, 0, 0}, 
                        {1, 1, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {0, 0, 0, 0}, 
                        {1, 1, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {0, 0, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 1, 0, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // Z-block lõpp


                // I-Block = 5
                {
                    // asend = 0
                    {
                        {1, 0, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {1, 0, 0, 0}, 
                        {1, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {1, 1, 1, 1}
                    },

                    // asend = 2
                    {
                        {0, 0, 0, 1}, 
                        {0, 0, 0, 1}, 
                        {0, 0, 0, 1}, 
                        {0, 0, 0, 1}
                    },

                    // asend = 3
                    {
                        {1, 1, 1, 1}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}, 
                        {0, 0, 0, 0}
                    }
                }, // I-block lõpp

                // O-Block = 6
                {
                    // asend = 0
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 1
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 2
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    },

                    // asend = 3
                    {
                        {0, 0, 0, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 1, 1, 0}, 
                        {0, 0, 0, 0}
                    }
                } // O-block lõpp

            }; // end of Array sisselugemine

        #endregion

        // klotstyyp on 0..6 mis tuvastab mis klotsiga meil tegu
        // asend on 0..3 mis tuvastab, millises pöördeasendis klots on.
        private int klotstyyp;
        private int asend;

        // järgmise klotsi andmed
        private int klotstyypNext;
        private int asendNext;

        // Klotsi asukoht on vasakul üleval ääres teda ümbritseva 4x4 ruudu sees
        private int positionRow;
        private int positionCol;

        // Collision detection muutujad
        private bool leftCollision;
        private bool rightCollision;
        private bool bottomCollision;
        private bool cwCollision;



        #region Properties

        public int Klotstyyp
        {
            get { return klotstyyp; }
            set { klotstyyp = value; }
        }

        public int Asend
        {
            get { return asend; }
            set { asend = value; }
        }

        public int KlotstyypNext
        {
            get { return klotstyypNext; }
            set { klotstyypNext = value; }
        }

        public int AsendNext
        {
            get { return asendNext; }
            set { asendNext = value; }
        }

        public int PositionRow
        {
            get { return positionRow; }
            set { positionRow = value; }
        }

        public int PositionCol
        {
            get { return positionCol; }
            set { positionCol = value; }
        }

        public bool LeftCollision
        {
            get { return leftCollision; }
            set { leftCollision = value; }
        }

        public bool RightCollision
        {
            get { return rightCollision; }
            set { rightCollision = value; }
        }

        public bool BottomCollision
        {
            get { return bottomCollision; }
            set { bottomCollision = value; }
        }

        public bool CwCollision
        {
            get { return cwCollision; }
            set { cwCollision = value; }
        }



        #endregion


        // Constructor
        public Klots()
        {
            // Teeme constructori koodist eraldi meetodi, kuna meil on seda ka teises kohas tarvis kasutada
            ResetBlock();
        }


        public void ResetBlock()
        {
            // See meetod määrab suvalised label ja state väärtused ja määrab 
            // alg positsiooni

            Random randomGenerator = new Random();

            klotstyyp = randomGenerator.Next(0, 7);
            asend = randomGenerator.Next(0, 4);

            klotstyypNext = randomGenerator.Next(0, 7);
            asendNext = randomGenerator.Next(0, 4);

            positionRow = start_rida;
            positionCol = start_tulp;
        }


        public void VotaJargmineKlots()
        {
            // See meetod sätib järgmise klotsi tüübi ja oleku hetke klotsi tüübiks
            // ja olekus. Pärast seda võetakse järgmine klots randomiga

            klotstyyp = klotstyypNext;
            asend = asendNext;

            positionRow = start_rida;
            positionCol = start_tulp;

            Random randomGenerator = new Random();

            klotstyypNext = randomGenerator.Next(0, 7);
            asendNext = randomGenerator.Next(0, 4);
        }


        public void JoonistaKlots(SpriteBatch spriteBatch)
        {
            // Joonistame liikuvat klotsi

            spriteBatch.Begin();

            for (int rida = 0; rida < 4; rida++)
                for (int tulp = 0; tulp < 4; tulp++)
                    if (Klots.KLOTSID[klotstyyp, asend, rida, tulp] == 1)
                    {
                        Vector2 tilePosition = Mootor.laua_ylemine_vasak_vektor +
                                Mootor.GameCoorToScreenVec(positionRow + rida, positionCol + tulp);
                        spriteBatch.Draw(BlockManiaGame.TileTextures[klotstyyp], tilePosition, Color.White);
                    }

            spriteBatch.End();
        }
       

        public void JoonistaJargmineKlots(SpriteBatch spriteBatch)
        {
            // Joonistame järgmise tuleva bloki

            spriteBatch.Begin();

            for (int rida = 0; rida < 4; rida++)
                for (int tulp = 0; tulp < 4; tulp++)
                    if (Klots.KLOTSID[klotstyypNext, asendNext, rida, tulp] == 1)
                    {
                        Vector2 tilePosition = Mootor.jargmise_klotsi_vektor + Mootor.GameCoorToScreenVec(rida, tulp);
                        spriteBatch.Draw(BlockManiaGame.TileTextures[klotstyypNext], tilePosition, Color.White);
                    }

            spriteBatch.End();
        }

    }
}
